#endif
/* Read a pte atomically from memory. */
-#define l1e_read_atomic(l1ep) l1e_from_intpte(pte_read_atomic(l1ep))
-#define l2e_read_atomic(l2ep) l2e_from_intpte(pte_read_atomic(l2ep))
-#define l3e_read_atomic(l3ep) l3e_from_intpte(pte_read_atomic(l3ep))
-#define l4e_read_atomic(l4ep) l4e_from_intpte(pte_read_atomic(l4ep))
+#define l1e_read_atomic(l1ep) \
+ l1e_from_intpte(pte_read_atomic(&l1e_get_intpte(*(l1ep))))
+#define l2e_read_atomic(l2ep) \
+ l2e_from_intpte(pte_read_atomic(&l2e_get_intpte(*(l2ep))))
+#define l3e_read_atomic(l3ep) \
+ l3e_from_intpte(pte_read_atomic(&l3e_get_intpte(*(l3ep))))
+#define l4e_read_atomic(l4ep) \
+ l4e_from_intpte(pte_read_atomic(&l4e_get_intpte(*(l4ep))))
/* Write a pte atomically to memory. */
-#define l1e_write_atomic(l1ep, l1e) pte_write_atomic(l1ep, l1e_get_intpte(l1e))
-#define l2e_write_atomic(l2ep, l2e) pte_write_atomic(l2ep, l2e_get_intpte(l2e))
-#define l3e_write_atomic(l3ep, l3e) pte_write_atomic(l3ep, l3e_get_intpte(l3e))
-#define l4e_write_atomic(l4ep, l4e) pte_write_atomic(l4ep, l4e_get_intpte(l4e))
+#define l1e_write_atomic(l1ep, l1e) \
+ pte_write_atomic(&l1e_get_intpte(*(l1ep)), l1e_get_intpte(l1e))
+#define l2e_write_atomic(l2ep, l2e) \
+ pte_write_atomic(&l2e_get_intpte(*(l2ep)), l2e_get_intpte(l2e))
+#define l3e_write_atomic(l3ep, l3e) \
+ pte_write_atomic(&l3e_get_intpte(*(l3ep)), l3e_get_intpte(l3e))
+#define l4e_write_atomic(l4ep, l4e) \
+ pte_write_atomic(&l4e_get_intpte(*(l4ep)), l4e_get_intpte(l4e))
/*
* Write a pte safely but non-atomically to memory.
* The PTE may become temporarily not-present during the update.
*/
-#define l1e_write(l1ep, l1e) pte_write(l1ep, l1e_get_intpte(l1e))
-#define l2e_write(l2ep, l2e) pte_write(l2ep, l2e_get_intpte(l2e))
-#define l3e_write(l3ep, l3e) pte_write(l3ep, l3e_get_intpte(l3e))
-#define l4e_write(l4ep, l4e) pte_write(l4ep, l4e_get_intpte(l4e))
+#define l1e_write(l1ep, l1e) \
+ pte_write(&l1e_get_intpte(*(l1ep)), l1e_get_intpte(l1e))
+#define l2e_write(l2ep, l2e) \
+ pte_write(&l2e_get_intpte(*(l2ep)), l2e_get_intpte(l2e))
+#define l3e_write(l3ep, l3e) \
+ pte_write(&l3e_get_intpte(*(l3ep)), l3e_get_intpte(l3e))
+#define l4e_write(l4ep, l4e) \
+ pte_write(&l4e_get_intpte(*(l4ep)), l4e_get_intpte(l4e))
/* Get direct integer representation of a pte's contents (intpte_t). */
#define l1e_get_intpte(x) ((x).l1)
#endif /* !__ASSEMBLY__ */
-#define pte_read_atomic(ptep) ({ \
- intpte_t __pte = *(intpte_t *)(ptep), __npte; \
- while ( (__npte = cmpxchg((intpte_t *)(ptep), __pte, __pte)) != __pte ) \
- __pte = __npte; \
+#define pte_read_atomic(ptep) ({ \
+ intpte_t __pte = *(ptep), __npte; \
+ while ( (__npte = cmpxchg(ptep, __pte, __pte)) != __pte ) \
+ __pte = __npte; \
__pte; })
-#define pte_write_atomic(ptep, pte) do { \
- intpte_t __pte = *(intpte_t *)(ptep), __npte; \
- while ( (__npte = cmpxchg((intpte_t *)(ptep), __pte, (pte))) != __pte ) \
- __pte = __npte; \
+#define pte_write_atomic(ptep, pte) do { \
+ intpte_t __pte = *(ptep), __npte; \
+ while ( (__npte = cmpxchg(ptep, __pte, (pte))) != __pte ) \
+ __pte = __npte; \
} while ( 0 )
-#define pte_write(ptep, pte) do { \
- *((u32 *)(ptep)+0) = 0; \
- wmb(); \
- *((u32 *)(ptep)+1) = (pte) >> 32; \
- wmb(); \
- *((u32 *)(ptep)+0) = (pte) >> 0; \
+#define pte_write(ptep, pte) do { \
+ u32 *__ptep_words = (u32 *)(ptep); \
+ __ptep_words[0] = 0; \
+ wmb(); \
+ __ptep_words[1] = (pte) >> 32; \
+ wmb(); \
+ __ptep_words[0] = (pte) >> 0; \
} while ( 0 )
/* root table */
#endif /* !__ASSEMBLY__ */
-#define pte_read_atomic(ptep) (*(intpte_t *)(ptep))
-#define pte_write_atomic(ptep, pte) ((*(intpte_t *)(ptep)) = (pte))
-#define pte_write(ptep, pte) ((*(intpte_t *)(ptep)) = (pte))
+#define pte_read_atomic(ptep) (*(ptep))
+#define pte_write_atomic(ptep, pte) (*(ptep) = (pte))
+#define pte_write(ptep, pte) (*(ptep) = (pte))
/* Given a virtual address, get an entry offset into a linear page table. */
#define l1_linear_offset(_a) (((_a) & VADDR_MASK) >> L1_PAGETABLE_SHIFT)